package com.zhuang.reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Reflection02 {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException,
			InvocationTargetException, InstantiationException, IllegalAccessException {
		// Field
		// Method
		// Constructor
		m1();
		m2();
		m3();
	}

	// 传统方法来调用hi
	public static void m1() {
		Cat cat = new Cat();
		long start = System.currentTimeMillis();
		for (int i = 0; i < 90000; i++) {
			cat.hi();
		}
		long end = System.currentTimeMillis();
		System.out.println("m1() 耗时=" + (end - start));
	}

	// 反射机制调用方法hi
	@SuppressWarnings("deprecation")
	public static void m2() throws ClassNotFoundException, IllegalAccessException, InstantiationException,
			NoSuchMethodException, InvocationTargetException {

		Class<?> cls = Class.forName("com.zhuang.reflection.Cat");
		Object o = cls.newInstance();
		Method hi = cls.getMethod("hi");
		long start = System.currentTimeMillis();
		for (int i = 0; i < 90000; i++) {
			hi.invoke(o);// 反射调用方法
		}
		long end = System.currentTimeMillis();
		System.out.println("m2() 耗时=" + (end - start));
	}

	// 反射调用优化 + 关闭访问检查
	@SuppressWarnings("deprecation")
	public static void m3() throws ClassNotFoundException, IllegalAccessException, InstantiationException,
			NoSuchMethodException, InvocationTargetException {

		Class<?> cls = Class.forName("com.zhuang.reflection.Cat");
		Object o = cls.newInstance();
		Method hi = cls.getMethod("hi");
		// 在反射调用方法时，取消访问检查
		hi.setAccessible(true);
		long start = System.currentTimeMillis();
		for (int i = 0; i < 90000; i++) {
			hi.invoke(o);// 反射调用方法
		}
		long end = System.currentTimeMillis();
		System.out.println("m3() 耗时=" + (end - start));
	}
}
